<script>
  //   有如下结构的树结构，定义一个函数findName，要求输入id，则返回对应的name

  const tree = [
    {
      id: 1,
      name: '浙江',
      children: [
        {
          id: 10,
          name: '杭州',
          children: [
            {
              id: 100,
              name: '西湖',
            },
            {
              id: 101,
              name: '余杭',
            },
          ],
        },
        {
          id: 11,
          name: '绍兴',
          children: [
            {
              id: 111,
              name: '绍兴1',
            },
            {
              id: 112,
              name: '绍兴2',
            },
          ],
        }
      ],
    },
    {
      id: 2,
      name: '山东',
      children: [
        {
          id: 20,
          name: '济南',
          children: [
            {
              id: 200,
              name: '济南1',
            },
            {
              id: 201,
              name: '济南2',
            },
          ],
        },
        {
          id: 21,
          name: '烟台',
          children: [
            {
              id: 211,
              name: '烟台1',
            },
            {
              id: 212,
              name: '烟台2',
            },
          ],
        }
      ],
    },
    {
      id: 3,
      name: '澳门',
      children: [
        {
          id: 30,
          name: '澳门1'
        },
        {
          id: 31,
          name: '澳门2'
        }
      ],
    }
  ]
  function findName(id, arr) {
    function arrFloat(newArr, att) {
      const result = JSON.parse(JSON.stringify(newArr)) || []

      for (let i = 0; i < result.length; i++) {
        const item = result[i][att]?.length && arrFloat(result[i][att], att)
        item?.length && result.push(...item)
        // console.log(item)
      }
      return result
    }
    const newArr = arrFloat(arr, 'children')
    const result = newArr.filter(i => i.id === id)
    console.log(result.length ? result[0].name : '未找到');
    return result.length ? result[0].name : '未找到'
  }
  findName(1, tree)//返回“浙江”
  findName(20, tree)//返回“济南”
  findName(212, tree)//返回“烟台2”
  findName(111111212, tree)// 返回“未找到”


  // ```
  // 2、// 编写一个函数，实现输入任意一个JSON对象，返回这个对象中所有 Number 类型值之和
  function getSum(obj) {
    //你的实现
    let result = 0
    Object.values(obj).forEach(item => {
      dataType(item) === 'number' && (result += item)
      dataType(item) === 'object' && (result += getSum(item))
      dataType(item) === 'array' && (result += getSum(item))
    })
    console.log(result);
    return result
  }

  function dataType(data) {
    return Object.prototype.toString.call(data).slice(8, -1).toLocaleLowerCase()
  }

  const jsonObj = {
    a: 1,
    b: {
      c: 2,
      d: "abc",
      e: [1, 2]
    },
    e: {
      f: {
        g: 3
      }
    }
  }

  getSum(jsonObj);
  // // 返回结果 9

  // 3、功能实现: 当发起多个请求时候，只能有一个在进行中的请求，当1个结束后下一个才继续。
  function request(url) {
    return new Promise(resolve => {
      console.log('fetch', url)
      setTimeout(() => { resolve(url) }, 1000)
    })
  }
  function fetchOnlyOneFun() {
    const queue = []
    let flag = true

    function promiseQueue() {
      flag = false

      if (queue.length) {
        queue[0]().then(() => {
          queue.shift()//删除自身

          queue.length && promiseQueue()
        })
      }
    }
    return (params) => {
      queue.push(() => request(params))

      flag && promiseQueue()
    }
  }

  const fetchOnlyOne = fetchOnlyOneFun()

  fetchOnlyOne(1);
  fetchOnlyOne(2);
  fetchOnlyOne(3);
  fetchOnlyOne(4);
  // 期待结果输出结果: 1, 2, 3, 4 间隔1s输出。

</script>
<script>
  [1, 2, 3, 4, 5].forEach(item => {
    console.log(item, 11);
  }, 11);
</script>